# -*- encoding: utf-8 -*-
import time
import sys
from osv import fields, osv
from tools.translate import _
import pdb
import logging

class GiayXacNhan(osv.osv):
   _name = 'ctsv.gxn'
   _description = 'Loai giay xac nhan'
   _columns = {
        'gxn_id' : fields.char('Mã giáy xác nhận', size = 64, required = True),
        'name' : fields.char('Tên giáy xác nhận', size = 64, required = True),
   }
   _defaults = {
    }
GiayXacNhan()


class GiayXacNhan_list(osv.osv):
   logging.getLoggerClass() 
   
   def check_existing(self, cr, uid, state, error_msg, context):
       logging.info('----state for checking err msg ---- : %s --- %s ', state, error_msg)
       if state:
           if str(state) == 'wrong' :
               if error_msg == False:
                   raise osv.except_osv(_('Thông báo!'), _('Chưa nhập thông báo lỗi!'))
       pass
   
   def check_existing(self, cr, uid, state, error_msg, context):
       logging.info('----state for checking err msg ---- : %s --- %s ', state, error_msg)
       if state:
           news_obj = self.pool.get('aas.news')
           if str(state) == 'wrong' :
               if error_msg == False:
                   raise osv.except_osv(_('Thông báo!'), _('Chưa nhập thông báo lỗi!'))
       pass

   def create(self, cr, uid, vals, context=None):
       logging.info('----gxn vals ---- : %s', vals)
       gxn_id = context.get('gxn_id', False)
       logging.info('----gxn id ---- : %s', gxn_id)
       gxn_ids = self.search(cr, uid, [('student.id', '=', uid), ('gxn_id.id', '=', gxn_id), ('state', 'in', ('wait','confirmed',)),], context=None)
       if len(gxn_ids) > 0:
           raise osv.except_osv(_('Thông báo!'), _('Đã tồn tại giấy xác nhận này!'))
       return super(GiayXacNhan_list, self).create(cr, uid, vals, context=context)
    
   def write(self, cr, uid, ids, vals, context=False):
       logging.info('----access write......');
       state = vals.get('state', False)
       err_msg = vals.get('error_msg', False)
       self.check_existing(cr, uid, state, err_msg, context=context)
       if state:
           obj = self.browse(cr, uid, ids[0], context=context)
           gxn_name = obj.gxn_id.name
           logging.info('----gxn name ---- : %s', gxn_name)
           if str(state) == 'wrong' :
               vals.update({'email_subject': u'giấy xác nhận ' + gxn_name + u' không hợp lệ',})
           if str(state) == 'confirmed' :
               vals.update({'email_subject': u'giấy xác nhận ' + gxn_name + u' đã ký',})
       super(GiayXacNhan_list, self).write(cr, uid, ids, vals, context=context)
       if state:
           if str(state) == 'wrong' or str(state) == 'confirmed':
               self.send_gxn_notification_email(cr, uid, ids[0], context)
       return True
   
   
   def button_wait_request(self, cr, uid, ids, context=False):
       self.write(cr, uid, ids, {'state': 'wait'}, context=context)
       return True
   def button_confirmed_request(self, cr, uid, ids, context=False):
       self.write(cr, uid, ids, {'state': 'confirmed'}, context=context)
       return True
   def button_finish_request(self, cr, uid, ids, context=False):
       self.write(cr, uid, ids, {'state': 'finish'}, context=context)
       return True
   def button_wrong_request(self, cr, uid, ids, context=False):
       self.write(cr, uid, ids, {'state': 'wrong'}, context=context)
       return True
   
   
   def default_gxn(self, cr, uid, context=False):
       if not context: context = {}
       res = False
       res = context.get('gxn_id', False)
       return res
   
   _name = 'ctsv.gxn.list'
   _description = 'Danh sach giay xac nhan'
   _columns = {
        'uni_code': fields.char('Mã trường', size=64),
        'student': fields.many2one('res.users', string='Sinh viên', domain=[('type', '=', 'student')], readonly=True, required = True),
        'name': fields.char('Họ tên', size=64),
        'code': fields.char('Mã số', size=64),
        'entrance_year': fields.char('Khóa', size=64),
        'date_entrance': fields.char('Ngày nhập học', size=64),
        'date_leave': fields.char('Ngày ra trường', size=64),
        'study_time': fields.char('Thời gian học (năm)', size=64),
        'study_time_month': fields.char('Thời gian học (tháng)', size=64),
        'date_birth': fields.char('Ngày sinh', size=64, required=False),
        'place_birth': fields.char('Nơi sinh', size=64),
        'mother_name': fields.char('Họ tên mẹ', size=128, required=False),
        'father_name': fields.char('Họ tên cha', size=128, required=False),
        'gov_id': fields.char('Số CMND', size=64, required=False),
        'gov_id_date': fields.char('Ngày cấp', size=64, required=False),
        'gov_id_place': fields.char('Nơi cấp', size=64, required=False),
        'tax_code': fields.char('Mã số thuế', size=64,),
        'country_id': fields.many2one('res.country', string='Quốc gia'),
        'gender': fields.selection((('male', _('Nam')), ('female', _('Nữ'))), string="Giới tính", required=False),
        'perm_addr': fields.char('Hộ khẩu thường trú', size=128,),
        'tel': fields.char('Số điện thoại cố định', size=64,),
        'mobile': fields.char('Số điện thoại di động', size=64,),
        'email': fields.char('Địa chỉ email', size=64,),
        'fax': fields.char('Số fax', size=64,),
        'monthly_fee': fields.float('Học phí hàng tháng', digits=(12,2)),
        'cur_addr': fields.char('Địa chỉ hiện tại', size=128,),
        'show_more_info': fields.boolean('Hiển thị các thông tin khác'),
        'receive_emails': fields.boolean('Nhận emails khi có thông báo mới'),
        'degree': fields.char('Hệ đào tạo', size=64,),
        'atype': fields.char('Loại hình đào tạo', size=64,),
        'level' : fields.selection((('1', _('1')), ('2', _('2')),
                                 ('3', _('3')), ('4', _('4')),
                                 ('5', _('5')), ('6', _('6')),), string='Sinh viên năm thứ'),
        'dept_id': fields.many2one('aas.department', string='Khoa'),
        'class_id': fields.many2one('aas.class', string='Lớp'),
        'gxn_id': fields.many2one('ctsv.gxn', string='Giáy xác nhận', readonly = True),
        'reason' : fields.char('Lý do', size = 700),
        'error_msg' : fields.char('Thông báo lỗi', size = 700),
        'state': fields.selection((('wait', _('Chờ ký')),
                                 ('wrong', _('Báo không hợp lệ')),
                                 ('confirmed', _('Đã ký')), ('finish', _('Đã nhận'))), string='Trạng thái', required = True),
        'thuoc_dien': fields.selection((('khongmiengiam', _('Không miễn giảm')),
                                 ('giamhocphi', _('Giảm học phí')),
                                 ('mienhocphi', _('Miễn học phí')),), string='Thuộc diện'),
        'doi_tuong': fields.selection((('khongmocoi', _('Không mồ côi')),
                                 ('mocoi', _('Mồ côi')),), string='Thuộc đối tượng'),
        'semester': fields.many2one('aas.academic.semester', string='Học kỳ'),
        'thuoc_doi_tuong': fields.char('Thuộc đối tượng', size=128,),
        'email_subject': fields.char('', size=128,),
   }
   _defaults = {
        'state': lambda *a: 'wait',
        'gxn_id': default_gxn,
    }
   
   
   def default_get(self, cr, uid, fields, context=False):
        user_obj = self.pool.get('res.users')
        current_user = user_obj.browse(cr, uid, uid, context=context)
        res = super(GiayXacNhan_list, self).default_get(cr, uid, fields, context=context)
        degree = ''
        if current_user.degree_id.name and current_user.atype_id.name:
            logging.info('------- degree:  %s ------- degree type:  %s', current_user.degree_id.name, current_user.atype_id.name)
        now = time.strftime('%m/%d/%Y')
        week_obj = self.pool.get('aas.academic.week')
        ids = week_obj.search(cr, uid, [('date_end', '>', now), ('date_start', '<=', now)], context=context)
        logging.info('----week ids : %s',ids)
        level = 5
        if ids:
            obj = week_obj.browse(cr, uid, ids[0], context=context)
            semester_id = obj.academic_semester.id or False
            year_name = obj.academic_semester.academic_year.name or False
            if current_user.code:
                level = int(year_name[2:4]) - int(str(current_user.code)[0:2]) + 1
            logging.info('----level : %s',level)
        res.update({'name': current_user.name,
                    'student': current_user.id,
                    'uni_code': 'QSC',
                    'gender': current_user.gender,
                    'code': current_user.code,
                    'entrance_year': '20' + str(current_user.code)[0:2],
                    'date_entrance': str(current_user.date_entrance)[0:2] + str(current_user.date_entrance)[-5:],
                    'study_time_month': 54,
                    'date_leave': '03/2013',
                    'study_time': '4.5',
                    'date_birth': str(current_user.date_birth)[-2:] + str(current_user.date_birth)[4:8] + str(current_user.date_birth)[0:4],
                    'place_birth': current_user.place_birth,
                    'mother_name': current_user.mother_name,
                    'father_name': current_user.father_name,                    
                    'gov_id': current_user.gov_id,
                    'gov_id_date': str(current_user.gov_id_date)[-2:] + str(current_user.gov_id_date)[4:8] + str(current_user.gov_id_date)[0:4],
                    'gov_id_place': current_user.gov_id_place,
                    'country_id': current_user.country_id.id,
                    'tax_code': current_user.tax_code,
                    'perm_addr': current_user.perm_addr,
                    'tel': current_user.tel,
                    'mobile': current_user.mobile,
                    'email': current_user.email,
                    'degree': current_user.degree_id.name,
                    'atype': current_user.atype_id.name,                    
                    'level': str(level),
                    'fax': current_user.fax,
                    'monthly_fee': 500000,
                    'cur_addr': current_user.cur_addr,
                    'show_more_info': current_user.show_more_info,
                    'receive_emails': current_user.receive_emails,
                    'dept_id': current_user.dept_id.id,
                    'class_id': current_user.class_id.id,})
        return res
    
   def send_gxn_notification_email(self, cr, uid, id, context=None):
       print '****Inside function to send emails...'
       if not context: context = {}
       email_template_obj = self.pool.get('poweremail.templates')
       mailbox_obj = self.pool.get('poweremail.mailbox')
       name = 'Thông báo từ phòng CTSV'
       template_ids = email_template_obj.search(cr, uid, [('name', '=', name)])
       if not len(template_ids):
           raise osv.except_osv(_('Lỗi!'), _('Không tìm thấy mẫu email "%s"!' % (name,)))
       emails_ids = email_template_obj.generate_mail(cr, uid, template_ids[0], [id], context=context)
       mailbox_obj.write(cr, uid, emails_ids, {}, context=context)
       print 'Đang gửi emails cho giấy xác nhận đã được ký...'
       mailbox_obj.send_all_mail(cr, uid, context=context)
       return True
    
   def print_report(self, cr, uid, ids, context=False):
       datas = {}
       if not id:
           raise osv.except_osv(_('Thông báo!'), _("Không thể tải bản in!"))
       logging.info('------- id report:  %s',id)
       datas['id'] = ids[0]
       datas['ids'] = ids
       datas['model'] = 'ctsv.gxn.list'
       logging.info('------- data rel:  %s',datas)
       gxn_list_obj = self.browse(cr, uid, ids[0], context=context)
       logging.info('----gxn id : %s',gxn_list_obj.gxn_id)
       report_name =  ''
       if gxn_list_obj.gxn_id.id == 1:
           report_name = 'ctsv_lamlaithe_report'
       if gxn_list_obj.gxn_id.id == 2:
           report_name = 'ctsv_xacnhansinhvien_report'
       if gxn_list_obj.gxn_id.id == 3:
           report_name = 'ctsv_vayvonnganhang_report'
       if gxn_list_obj.gxn_id.id == 4:
           report_name = 'ctsv_mienhocphi_report'
       return {
           'type': 'ir.actions.report.xml', 
           'report_name': report_name, 
           'datas': datas
       }
   
GiayXacNhan_list()

class gxn_personal(osv.TransientModel):
    _name = 'ctsv.gxn.personal'
    _columns = {
        'gxn_ids': fields.many2many('ctsv.gxn.list', 'dsgxn_list_rel', 'ds_id', 'gxnid', string='Danh sách', readonly=True),
        'readonly': fields.boolean('', readonly=True),
    }
    _defaults = {  
        'readonly': lambda *a: True,
    }
    
    def default_get(self, cr, uid, fields, context=False):
        res = super(gxn_personal, self).default_get(cr, uid, fields, context=context)
        self.list_id = False
        gxn_obj = self.pool.get('ctsv.gxn')
        list_obj = self.pool.get('ctsv.gxn.list')
        gxns = gxn_obj.search(cr, uid, [], context=None)
        list_wrong = []
        for gxn in gxns:
            ids_wrong = list_obj.search(cr, uid, [('student', '=', uid), ('state', 'in', ('wrong',)), ('gxn_id.id', '=', gxn),], context=None)
            if len(ids_wrong) > 0:
                ids_wrong.sort(reverse=True)
                ids_others = list_obj.search(cr, uid, [('student', '=', uid), ('state', 'in', ('wait','confirmed','finish')), ('gxn_id.id', '=', gxn),], context=None)
                if len(ids_others)> 0:
                    ids_others.sort(reverse=True)
                    if ids_others[0] < ids_wrong[0]:
                        list_wrong.append(ids_wrong[0])
                else:
                    list_wrong.append(ids_wrong[0])
        ids = list_obj.search(cr, uid, [('student', '=', uid), ('state', 'in', ('wait','confirmed',)),], context=None)
        logging.info('------- wrong ids:  %s ------- ids:  %s', list_wrong, ids)
        res.update({'gxn_ids': ids + list_wrong})
        return res
    
gxn_personal()


class gxn_err_dialog(osv.osv_memory):
    _name='ctsv.gxn.list.dialog'
    _columns = {
                'gxn_list_id': fields.integer('id'),
                'error_msg' : fields.char('Thông báo lỗi', size = 700),
            }
    _defaults = {
        }
    def write_error_msg(self, cr, uid, ids, context=None):
        records = self.browse(cr, uid, ids)
        gxn_list_obj = self.pool.get('ctsv.gxn.list')
        for r in records:
            gxn_list_obj.write(cr, uid, [r.gxn_list_id], {'state': 'wrong', 'error_msg': r.error_msg,}, context=context)
        return {
                'type': 'ir.actions.act_window_close',
         }
        
    def default_get(self, cr, uid, fields, context=False):
        res = super(gxn_err_dialog, self).default_get(cr, uid, fields, context=context)
        id = context.get('active_id', False)
        logging.info('---- ACTIVE ID:  %s',id)
        if id:
            res.update({'gxn_list_id': id})
        return res
            
gxn_err_dialog()

class ctsv_gxn_multicheck(osv.TransientModel):
    _name='ctsv.gxn.multicheck'
    _columns = {
        'name' : fields.char('Tên', size = 64, required = False),
    }
    _defaults = {  
#        'readonly': lambda *a: True,
    }
    
    def default_get(self, cr, uid, fields, context=False):
        res = super(ctsv_gxn_multicheck, self).default_get(cr, uid, fields, context=context)
        ids = context.get('active_ids', [])
        logging.info('---- ACTIVE IDS:  %s',ids)
        self.list_id = []
        if ids:
            self.list_id += ids
        return res
    
    def button_confirmed_request(self, cr, uid, ids, context=False):
        if self.list_id:
            gxn_list_obj = self.pool.get('ctsv.gxn.list')
            for gxn_list_id in self.list_id:
                obj = gxn_list_obj.browse(cr, uid, gxn_list_id, context=context)
                if obj.state == 'wait':
                    gxn_list_obj.write(cr, uid, [gxn_list_id], {'state': 'confirmed'}, context=context)
        return {
                'type': 'ir.actions.act_window_close',
         }
    
    def button_finish_request(self, cr, uid, ids, context=False):
        if self.list_id:
            gxn_list_obj = self.pool.get('ctsv.gxn.list')
            for gxn_list_id in self.list_id:
                obj = gxn_list_obj.browse(cr, uid, gxn_list_id, context=context)
                if obj.state == 'confirmed':
                    gxn_list_obj.write(cr, uid, [gxn_list_id], {'state': 'finish'}, context=context)
        return {
                'type': 'ir.actions.act_window_close',
         }
        
ctsv_gxn_multicheck()
